/**
 * 最基础版本的深拷贝
 * 使用递归的思想
 * 考虑了数组的情况
 * 解决循环引用的问题
 * WeekMap优化
 * target和obj之间存在弱引用关系，下一次垃圾回收机制执行的时候，内存空间会被回收
 * */ 
function clone (target, map = new WeakMap()) {
  if (typeof target === 'object') {
    let cloneTarget = Array.isArray(target) ? [] : {} // 考虑数组的情况
    if (map.get(target)) {
      return map.get(target)
    }
    map.set(target, cloneTarget)
    for (key in target) {
      cloneTarget[key] = clone(target[key], map)
    }
    return cloneTarget
  } else {
    return target
  }
}

const target = {
  field1: 1,
  field2: undefined,
  field3: 'ConardLi',
  field4: {
      child: 'child',
      child2: {
          child2: 'child2'
      }
  },
  field5: [1, 2, 3, 4, 5]
};

// console.log(clone(target))
console.log(clone(target.target = target)) // 造成堆栈溢出